package com.yunxin.admin.system.infra.persistence.repository;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunxin.admin.system.domain.model.menu.Menu;
import com.yunxin.admin.system.domain.model.menu.MenuRepository;
import com.yunxin.admin.system.infra.persistence.converter.MenuConverter;
import com.yunxin.admin.system.infra.persistence.entity.SysMenuDO;
import com.yunxin.admin.system.infra.persistence.mapper.SysMenuMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

/**
 * @author zero°
 * @since 2023-07-11
 */
@Repository
@RequiredArgsConstructor
public class MenuRepositoryImpl extends ServiceImpl<SysMenuMapper, SysMenuDO> implements MenuRepository, IService<SysMenuDO> {

    private final MenuConverter menuConverter;
    @Override
    public boolean saveOrUpdate(Menu menu) {
        SysMenuDO sysMenuDO = menuConverter.fromMenu(menu);
        return this.saveOrUpdate(sysMenuDO);
    }


    @Override
    public boolean remove(Long id) {
        if (id != null) {
            this.remove(new LambdaQueryWrapper<SysMenuDO>()
                    .eq(SysMenuDO::getId, id)
                    .or()
                    .apply("CONCAT (',',tree_path,',') LIKE CONCAT('%,',{0},',%')", id));
        }
        return true;
    }

    @Override
    public boolean updateVisible(Long id, Integer visible) {
        return this.update(new LambdaUpdateWrapper<SysMenuDO>()
                .eq(SysMenuDO::getId, id)
                .set(SysMenuDO::getVisible, visible)
        );
    }

    @Override
    public Menu getMenuById(Long id) {
        SysMenuDO sysMenuDO =  this.getById(id);
        return menuConverter.toMenu(sysMenuDO);
    }
}
